package com.gitee.huxing.algorithmic.link;

/**
 * @Description: 链表实现
 * @ProjectName: AlgorithmicPactice
 * @Package: com.gitee.huxing.algorithmic.link
 * @ClassName: Linked_List
 * @Author: huxing
 * @DateTime: 2021-12-15 9:54 上午
 */
public class Linked_List {

    /** 头节点 **/
    Node head = null;

    /**
     * @Description: 计算节点的长度
     * @Author: huxing
     * @param
     * @return int
     * @Date: 2021/12/15 9:56 上午
     **/
    public int getLength(){
        int list_length = 0;
        Node cur_node = null;
        cur_node = head;
        while (cur_node != null){
            list_length++;
            cur_node = cur_node.next;
        }
        return list_length;
    }

    /**
     * @Description: 添加节点记录
     * @Author: huxing
     * @param data
     * @Date: 2021/12/15 9:56 上午
     **/
    public void add(int data){
        Node newNode = new Node(data);
        // 判断是否只有头节点
        if (head == null){
            head = newNode;
            return;
        } else {
            Node temp = head;
            while (temp.next != null){
                // 不是头节点，则轮询寻找下一个节点
                temp = temp.next;
            }
            // 添加到该节点的下一个节点位置
            temp.next = newNode;
        }
    }

    /**
     * @Description: 根据下标删除节点
     * @Author: huxing
     * @param index
     * @return boolean
     * @Date: 2021/12/15 9:59 上午
     **/
    public boolean delete(int index){
        // 判断下标位置是否正确
        if (index < 1 || index > getLength()){
            System.out.println("你所要删除的元素下标输入有问题");
            return false;
        }
        // 删除第一个节点
        if (index == 1){
            head = head.next;
            return true;
        }

        // 循环查找节点，找到对应的节点修改指针的指向位置
        Node pre_node = head;
        Node cur_code = pre_node.next;
        int i = 2;
        while (pre_node != null){
            if (i == index){
                pre_node.next = cur_code.next;
                return true;
            } else {
                pre_node = pre_node.next;
                cur_code = cur_code.next;
                i++;
            }
        }
        return true;
    }

    /**
     * @Description: 根据数据求下标
     * @Author: huxing
     * @param data
     * @return int
     * @Date: 2021/12/15 10:03 上午
     **/
    public int get_data(int data){
        Node node = head;
        int index = 0;
        while (node != null){
            if (node.data == data){
                return index;
            }
            node = node.next;
            index++;
        }
        return -1;
    }

    public int get(int index){
        if (index < 1 || index > getLength()){
            System.out.println("你所要查找的元素下标输入有问题");
            return -1;
        }
        Node node = head;
        int count = 0;
        while (node != null){
            if (count == index){
                return node.data;
            }
            node = node.next;
            count++;
        }
        return -1;
    }

    /**
     * @Description: 打印链表数据
     * @Author: huxing
     * @param
     * @return java.lang.String
     * @Date: 2021/12/15 10:04 上午
     **/
    public void print(){
        Node node = head;
        StringBuilder builder = new StringBuilder();
        while (node != null){
            builder.append(node.data);
            if (node.next != null){
                builder.append(",");
            }
            node = node.next;
        }
        System.out.println(builder.toString());
    }

    public static void main(String[] args) {
        Linked_List linked_list = new Linked_List();
        linked_list.add(1);
        linked_list.add(2);
        linked_list.add(3);
        linked_list.add(4);
        linked_list.add(5);
        linked_list.add(6);

        // 打印链表数据
        linked_list.print();

        // 打印当前下标为4的数据
        int index = linked_list.get_data(4);
        System.out.println(index);

        // 删除一条数据
        linked_list.delete(4);
        linked_list.print();

        // 再次打印当前下标为4的数据
        int data = linked_list.get(4);
        System.out.println(data);

        // 再次打印当前下标为4的数据
        data = linked_list.get(7);
        System.out.println(data);
    }
}
